package com.sigmatrix.h5.service.rebate;

import com.sigmatrix.h5.auth.ILoginUser;

/**
 * 返利handle接口。
 * 
 * @author wei.wang
 *
 * @param <T>
 */
public interface IRebateHandle<T extends RebateBaseInfo> {
	
	/**
	 * 生成返利场景包装信息
	 * 
	 * @param input 输入信息
	 * @param userInfo 用户登陆信息
	 * @param serialNum 流水号
	 * @return
	 */
	T getRebateBaseInfo(IRebateInput input, ILoginUser userInfo, String serialNum);

	/**
	 * 判断是否进行返利
	 * 
	 * @param info
	 * @return
	 */
	boolean isRebateAllowed(T info);

	/**
	 * 获取候选群体
	 * 
	 * @param info
	 * @return
	 */
	RebateCandidate getRebateCandidate(T info);

	/**
	 * 根据候选群体选择最终返利目标群体
	 * 
	 * @param info
	 * @param candidate
	 * @return
	 */
	RebateObjects chooseObject(T info, RebateCandidate candidate);

	/**
	 * 对目标群体进行返利
	 * 
	 * @param obj
	 * @param info
	 */
	void doRebate(RebateObjects obj, T info);

	/**
	 * 返利执行入口
	 * 
	 * @param input 输入信息
	 * @param userInfo 用户登陆信息
	 * @return IRebateResult 返利结果包装。
	 */
	IRebateResult doProcess(IRebateInput input, ILoginUser userInfo);

	/**
	 * 添加采集器
	 * 
	 * @param colletor
	 */
	void addColletor(PrepositInfoCollect<T> colletor);

	/**
	 * 添加拦截器
	 * 
	 * @param interceptor
	 */
	void addInterceptor(RebateIntercept<T> interceptor);

	/**
	 * 添加选择器
	 * 
	 * @param chooser
	 */
	void addChooser(ObjectChoose<T> chooser);

	/**
	 * 添加返利action
	 * 
	 * @param action
	 */
	void addAction(RebateAction<T> action);

	/**
	 * 生成RebateBaseInfo信息。
	 * 
	 * @return
	 */
	T buildRebateBaseInfo();
}
